package com.example.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 密码加密工具类
 * 使用 SHA-256 + Salt 进行密码加密
 */
@Component
public class PasswordUtils {

    @Autowired
    private CommonUtils commonUtils;

    /**
     * 生成随机盐值
     * @return 10位随机字符串盐值
     */
    public String generateSalt() {
        return commonUtils.generateRandomString(10);
    }

    /**
     * 使用SHA-256 + Salt加密密码
     * 密码密文 = sha256(密码+salt)
     * @param password 明文密码
     * @param salt 盐值
     * @return 加密后的密码（十六进制字符串）
     */
    public String encryptPassword(String password, String salt) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            
            // 将密码和盐值组合：密码+salt
            String saltedPassword = password + salt;
            
            // 进行SHA-256哈希
            byte[] hashedBytes = md.digest(saltedPassword.getBytes(StandardCharsets.UTF_8));
            
            // 转换为十六进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : hashedBytes) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("SHA-256算法不可用", e);
        }
    }

    /**
     * 验证密码
     * @param password 用户输入的明文密码
     * @param salt 存储的盐值
     * @param encryptedPassword 存储的加密密码
     * @return 密码是否匹配
     */
    public boolean verifyPassword(String password, String salt, String encryptedPassword) {
        String hashedInputPassword = encryptPassword(password, salt);
        return hashedInputPassword.equals(encryptedPassword);
    }

    /**
     * 生成密码和盐值（用于新用户注册）
     * @param password 明文密码
     * @return PasswordResult 包含加密密码和盐值
     */
    public PasswordResult generatePasswordAndSalt(String password) {
        String salt = generateSalt();
        String encryptedPassword = encryptPassword(password, salt);
        return new PasswordResult(encryptedPassword, salt);
    }

    /**
     * 密码结果内部类
     */
    public static class PasswordResult {
        private final String encryptedPassword;
        private final String salt;

        public PasswordResult(String encryptedPassword, String salt) {
            this.encryptedPassword = encryptedPassword;
            this.salt = salt;
        }

        public String getEncryptedPassword() {
            return encryptedPassword;
        }

        public String getSalt() {
            return salt;
        }
    }
}
